#include "include.h"
#include "plate_reverb.h"
#include "api_alg.h"

#if PLATE_REVERB_EN

static plate_reverb_cfg_t plate_reverb_cfg AT(.buf.plate_reverb.decay);
static prvb_init_sb prvb_t AT(.buf.plate_reverb.decay);

/*plate reverb 初始化结构体*/

AT(.text.plate_reverb_init)
void plate_reverb_audio_init(u8 sample_rate, u16 samples)
{
    /*初始化参数*/
    memset(&prvb_t, 0, sizeof(prvb_t));

	prvb_t.mix_set        = PLATE_REVERB_MIX;        //0.4*2^15干湿比       值越大混响效果越明显 0-32767
	prvb_t.damping_set    = PLATE_REVERB_DAMPING;       //0.05*2^15阻尼       值越小高频衰减越多，声音越干 0-32767
	prvb_t.decay_set      = PLATE_REVERB_DECAY;       //0.5*2^15衰减率      值越小，衰减越快，尾音少 0-32767
	prvb_t.ALLPASS_G2_set = PLATE_REVERB_ALLPASS;       //0.5*2^15衰减扩散    控制尾部密度  0-32767
	prvb_t.vocals_set     = PLATE_REVERB_VOCALS;       //人声部分 值越大 人声越突出  0-65535
    plate_buf_init(&prvb_t);
//    my_printf("%d %d %d %d\r\n",prvb_t.mix_set ,
//              prvb_t.damping_set,
//              prvb_t.decay_set,
//              prvb_t.ALLPASS_G2_set);

    memset(&plate_reverb_cfg, 0, sizeof(plate_reverb_cfg_t));

    plate_reverb_cfg.sample_rate = sample_rate;
    plate_reverb_cfg.samples     = samples;
    plate_reverb_cfg.mute        = 0;   //默认使能

}

AT(.text.plate_reverb_set.mute)
void plate_reverb_audio_mute_set(uint8_t mute)
{
    plate_reverb_cfg.mute = mute;
}


/// mix_set:       干湿比,值越大混响效果越明显 0-32767
/// damping_set:   阻尼,值越小高频衰减越多，声音越干 0-32767
/// decay_set:     衰减率,值越小，衰减越快，尾音少 0-32767
/// ALLPASS_G2_set:衰减扩散,控制尾部密度  0-32767
/// vocals_set:    人声部分,值越大,人声越突出  0-65535
/// 默认参数plate_reverb_audio_set_param(8553,13638,20000,22999,32767)
AT(.text.plate_reverb_set.param)
void plate_reverb_audio_set_param(u16 mix_set, u16 damping_set, u16 decay_set, u16 ALLPASS_G2_set, u16 vocals_set)
{
    memset(&prvb_t, 0, sizeof(prvb_init_sb));

    if(mix_set> 32767){
        mix_set = 32767;
    }
    if(damping_set> 32767){
        damping_set = 32767;
    }
    if(decay_set> 32767){
        decay_set = 32767;
    }
    if(ALLPASS_G2_set> 32767){
        ALLPASS_G2_set = 32767;
    }
    if(vocals_set> 65535){
        vocals_set = 65535;
    }

    /*初始化参数*/
	prvb_t.mix_set        = mix_set;               //0.4*2^15干湿比      值越大混响效果越明显 0-32767
	prvb_t.damping_set    = damping_set;           //0.05*2^15阻尼       值越小高频衰减越多，声音越干 0-32767
	prvb_t.decay_set      = decay_set;             //0.5*2^15衰减率      值越小，衰减越快，尾音少 0-32767
	prvb_t.ALLPASS_G2_set = ALLPASS_G2_set;        //0.5*2^15衰减扩散    控制尾部密度  0-32767
	prvb_t.vocals_set     = vocals_set;            //人声部分 值越大 人声越突出  0-65535
    plate_buf_init(&prvb_t);

}

AT(.text.plate_reverb_set.callback)
void plate_reverb_audio_output_callback_set(audio_callback_t callback)
{
    plate_reverb_cfg.callback = callback;
}

AT(.text.plate_reverb_proc.input)
void plate_reverb_audio_input(u8 *ptr, u32 samples, int ch_mode, void *params)
{
    s16 *rptr = (s16 *)ptr;
    if(!plate_reverb_cfg.mute){
        for(u8 i = 0;i < samples; i++){
            plate_reverb_process(&rptr[i],&rptr[i]);
        }
    }

    if (plate_reverb_cfg.callback) {
        plate_reverb_cfg.callback((u8 *)rptr, samples, ch_mode, params);
    }
}

AT(.text.plate_reverb_exit)
void plate_reverb_audio_exit(void)
{
}

#endif //PLATE_REVERB_EN
